首先DaemonSet Controller会从Etcd里获取node的节点列表, 之后一个一个区遍历检查,看看node是不是有一个特定的label(这个label是创建DaemonSet 时指定的,即spec.template.metadata.labels
) , 如果有这个pod就不管,没有就创建, 多了就删
在创建pod的时候, 会指定pod在指定的node上创建, 即在创建pod的时候DaemonSet 会自动在pod的API对象上加一个nodeAffinity
字段 , 这个字段的作用就是指定pod只能运行在当前节点
这个字段的具体增加是:
1 | apiVersion: v1 |
上述的含义是:
requiredDuringSchedulingIgnoredDuringExecution
:每次调度的时候予以考虑
而且只能运行在metadata.name
是node-test
的节点上 ,上面的opetator:In
表示部分匹配,如果是完全匹配则是operator:Equal
同时DaemonSet会自动加一个tolerations
字段, 意味着会容忍(tolerations
)某些污点(Taint
)
会自动加上格式如下:
1 | apiVersion: v1 |
例子:
在kubernetes中, 一个节点的网络插件没有被安装上的时候会自动增加一个名为:node.kubernetes.io/network-unavailable
的污点
而DaemonSet部署一个网络插件的时候必须在这个DaemonSet的yaml文件里,加上一个能够容忍node.kubernetes.io/network-unavailable
污点的toleration
比如:
1 | ... |
这样在调度的时候, kubernetes就会了忽略这个污点, 成功将其调度起来